快速測試不同寫法的效能差異。
同步更新於個人部落格
BenchmarkDotNet範例
選擇主控台應用程式專案範本,並執行下一步
命名你的專案名稱,並選擇專案要存放的位置。
直接進行下一步
下載BenchmarkDotNet套件與automapper套件,automapper為這次要測試效能的套件
此次要測試的項目為三種類別轉換的效能差異
using AutoMapper;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
//指定要測試的class
var summary = BenchmarkRunner.Run<BenchmarkSampleAuto>();
//加入記憶體使用量測試
[MemoryDiagnoser]
public class BenchmarkSampleAuto {
private readonly List<DbModel> _data = new List<DbModel>();
private readonly IMapper _mapper;
public BenchmarkSampleAuto() {
//automapper設定
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<DbModel, ViewModel>();
});
_mapper = new Mapper(config);
//準備一份List資料
PrepareTestObjects();
}
private void PrepareTestObjects() {
_data.Add(new DbModel() { Id = 1, Name = "Bill", Age = 18, CreatedDate = DateTime.Now });
_data.Add(new DbModel() { Id = 1, Name = "CI-YU", Age = 20, CreatedDate = DateTime.Now });
_data.Add(new DbModel() { Id = 1, Name = "Bill Huang", Age = 22, CreatedDate = DateTime.Now });
}
//待測方法需要加上Benchmark屬性
[Benchmark]
public List<ViewModel> first() {
return _mapper.Map<List<ViewModel>>(_data);
}
//待測方法需要加上Benchmark屬性
[Benchmark]
public List<ViewModel> second() {
var listModel = new List<ViewModel>();
foreach (var c in _data) {
listModel.Add(new ViewModel() { Id = c.Id, Name = c.Name, Age = c.Age });
}
return listModel;
}
//待測方法需要加上Benchmark屬性
[Benchmark]
public List<ViewModel> third() {
var listModel = new List<ViewModel>();
listModel = _data.Select(c => new ViewModel() { Id = c.Id, Name = c.Name, Age = c.Age }).ToList();
return listModel;
}
}
public class DbModel {
public int Id { get; set; }
public string? Name { get; set; }
public int Age { get; set; }
public DateTime CreatedDate { get; set; }
}
public class ViewModel {
public ViewModel() {
Name = string.Empty;
}
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
執行測試前需要將組態改為Release才可以進行測試
最後的執行結果發現第二種方法的效能是最好的,通常最主要是看mean及allocated兩個參數
在專案資料夾bin\Release\net6.0\BenchmarkDotNet.Artifacts\results底下會有詳細的報告,檔案格式有csv,html,md